package cn.blnp.net.flowable.event.start.error;

import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * <h3>开始事件-错误开始事件</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/5/7 15:48
 */
@Slf4j
@SpringBootTest
public class ErrorEventTest {

    @Resource
    private RuntimeService runtimeService;
    @Resource
    private RepositoryService repositoryService;
    @Resource
    private TaskService taskService;

    /**
     *  <p>
     *      错误开始事件可以触发一个事件子流程，且总是在另外一个流程异常结束时触发。
     *  </p>
     *  <pre>
     *      {@code
     *          <!-- 定义消息 -->
     *          <error id="theError" errorCode="theErrorCode"/>
     *          <process id="errorStartEventProcess">
     *              <!-- 定义开始节点 -->
     *              <startEvent id="errorStart" >
     *                  <!-- 包含 errorEventDefinition子元素，代表错误开始事件 -->
     *                  <errorEventDefinition errorRef="theError" />
     *              </startEvent>
     *              <!-- 其他元素省略 -->
     *          </process>
     *      }
     *  </pre>
     *  <p>
     *      <b>注意：</b>错误开始事件不能独立存在，必须存在于事件子流程中。错误开始事件可以用来触发一个事件子流程。错误开始事件不能用来启动流程实例。错误开始事件都是中断事件。
     *  </p>
     *
     *  <h2>演示案例</h2>
     *  <hr/>
     *  <b>流程定义文件：</b>{@link flow/errorEventTest.bpmn20.xml}
     *  <b>流程预览图：</b><br/>
     *  <img src="https://free4.yunpng.top/2025/05/07/681b157fa1a61.png" />
     **/
    @Test
    public void test() {
        // 部署流程定义
        Deployment deploy = repositoryService.createDeployment()
                .name("错误开始事件测试")
                .addClasspathResource("flow/errorEventTest.bpmn20.xml")
                .deploy();
        log.info("部署流程定义：{}", deploy.getId());
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("errorEventTest");
        log.info("启动流程实例：{}", processInstance.getId());

        /**
         *  演示结果：
         * 2025-05-07 16:18:23.145  INFO 77732 --- [           main] c.b.n.f.e.start.error.ErrorEventTest     : 部署流程定义：d76fb9ca-2b1b-11f0-a0b9-50ebf6ec8f6d
         * 2025-05-07 16:18:23.158 ERROR 77732 --- [           main] c.b.n.f.e.s.e.FinancialAuditDelegate     : 财务审计节点，审计处理异常！
         * 2025-05-07 16:18:23.164  WARN 77732 --- [           main] b.n.f.e.s.e.ReportFinanceOfficerDelegate : 发现财务审计异常，上报财务主管！
         * 2025-05-07 16:18:23.192  INFO 77732 --- [           main] c.b.n.f.e.start.error.ErrorEventTest     : 启动流程实例：d7b415ce-2b1b-11f0-a0b9-50ebf6ec8f6d
         **/
    }
}
